【问题标题】:How to program python variable to point different reference location but same value [duplicate]如何编程python变量以指向不同的参考位置但相同的值[重复]
【发布时间】:2016-07-14 15:45:08
【问题描述】:

经过一段时间的思考,我想到了这个概念,几天前我已经完成了。

在 Python 中,如果我做了 x=y,那么 x 和 y 将自动指向相同的对象引用位置,但有什么方法可以改变 y 引用位置,但如果 x 具有相同的值。

例如:

x=100
y=x

现在 x 和 y 共享值 100 的相同对象引用位置,但我希望 y 具有不同的位置。

编辑:我正在尝试做的事情

l1=[1,2,3,4]
l2=l1
i=0
j=len(l1)-1

while j >= 0 :
    l1[i]=l2[j]
    i=i+1
    j=j-1

    print("L1=",l1,"L2",l2,"i=",i,"j=",j)

我得到的结果

L1= [4, 2, 3, 4] L2 [4, 2, 3, 4] i= 1 j= 2
L1= [4, 3, 3, 4] L2 [4, 3, 3, 4] i= 2 j= 1
L1= [4, 3, 3, 4] L2 [4, 3, 3, 4] i= 3 j= 0
L1= [4, 3, 3, 4] L2 [4, 3, 3, 4] i= 4 j= -1

谢谢。

【问题讨论】:

  • 您无法可靠地实现这一目标。该值可能例如被拘留,系统试图避免创建多个实例。你想达到什么目的?
  • @UlrichEckhardt 我正在尝试通过迭代实现列表交换,然后我失败了。
  • 仍不清楚。举个例子。换句话说:你肯定不需要这个,一定是你做错了什么。
  • @Selcuk 我的意图不同。不过谢谢。
  • @Raja 链接的答案表明,在缓存 -5 到 256 之间的整数时,它们不能有不同的内存位置。您的问题与整数缓存无关。当您写 l2=l1 时,您只是在复制参考。使用l2=l1[:]copy.copy(l1)

标签: python object reference


【解决方案1】:

这不太可能发生在小数字中,因为数字在 Python 中是不可变的,并且运行时几乎可以肯定会使 xy “指向”对象存储中的同一个对象:

>>> x = 100
>>> id(x)
4534457488
>>> y = 100
>>> id(y)
4534457488

请注意,即使通过使 y 引用 100 的新副本,我仍然得到相同的对象。

我们可以试试:

>>> y = 25 * (5 - 1)
>>> id(y)
4534457488

一样。

如果我们使用像列表这样可变的东西,我们可以这样做:

>>> x = [1, 2, 3]
>>> id(x)
4539581000
>>> y = [1, 2] + [3]
>>> id(y)
4539578440
>>> x == y
True
>>> id(x) == id(y)
False

现在你有两个变量,每个变量引用对象存储中的不同对象,但对象值是相等的。

正如 wRAR 指出的那样,copy.copy 可以更干净地做事:

>>> from copy import copy
>>> x = [1, 2, 3]
>>> id(x)
4539578440
>>> y = copy(x)
>>> id(y)
4539580232

多田。这更符合您的要求,但请注意它可能不适用于数字等不可变对象!

>>> from copy import copy 
>>> x = 100
>>> id(x)
4534457488
>>> y = copy(x)
>>> y
100
>>> id(y)
4534457488

我的 Python 解释器将在对象存储中生成 一个 int 值为 100 的对象。

对于较大的数字,情况可能并非如此。我试过了:

>>> x = 393
>>> id(x)
4537495408
>>> y = 393
>>> id(y)
4539235760

我找到了in this S.O. question 的信息,其中回答者在对象池上尝试了整数。预缓存整数对象的数量可能取决于 Python 中的实现,而 JVM does define caching behavior.

【讨论】:

  • 非常好,但是每次我需要切片并附加 y[-1] 以便我可以指向不同的对象位置。
  • 追加是一种变异操作,不会改变列表的id。您将需要复制或使用+ 来创建一个新列表。
【解决方案2】:

你不能用 int 来做。更多:

x = 100 
y = 100
x is y
>>> True

这就像一个小整数池。它们在memory 中只有一个表示形式。

使用mutable 对象,您可以执行copy() 操作:

a = [1]
b = copy(a)
a is b 
>>> False 

【讨论】:

    【解决方案3】:

    您可以为此使用copy.copy()

    【讨论】:

    • 我试过了,但它没有达到 OP 的要求:>>> from copy import copy >>> x = 100 >>> id(x) 4534457488 >>> y = copy(x) >>> y 100 >>> id(y) 4534457488
    • 你介意举个例子吗? :编辑:雷在他的回答中提到。很好。感谢您指出 wRAR。
    • @Ray Toal,请看我的回答。我们不能复制“小”int 它只有一个表示
    • 对。 More info here.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多