【问题标题】:How is this property of an object a different value in these two cases? [duplicate]在这两种情况下,对象的这个属性如何不同? [复制]
【发布时间】:2013-06-20 13:48:30
【问题描述】:

list(Case 1) 的属性如何调用以使print y 的输出与Case 2 不同?

# Case 1: using a list as value
>>> x = ["one", "two", "three"]
>>> y = x
>>> x[0] = "four"
>>> print x
["four", "two", "three"]
>>> print y
["four", "two", "three"]

# Case 2: using an integer as value
>>> x = 3
>>> y = x
>>> x = x + 1
>>> print x
4
>>> print y
3

编辑

为了表明这种行为与列表是可变的和字符串不是无关的,代替案例 2,可以给出以下案例:

>>> x = ["one", "two", "three"]
>>> y = x
>>> x = x + ["four", "five"]
>>> print x
["four", "two", "three", "four", "five"]
>>> print y
["four", "two", "three"]

【问题讨论】:

  • 请使您的问题的标题可读。避免将代码放在那里,最好尝试总结您的问题。
  • 如果有人不知道引用与值的关系,作为这个问题的一个好标题吗?
  • 对了,如果你不知道房产的名称,你会如何解释 Ivaylo?
  • 关于某人对标题所做的更改:它可能更易于阅读,但描述性较差。我真的不认为这是一种改进。如果有人和我有同样的问题,我看不出这个标题会如何引导他进入这个话题。所以这个问题很容易再次被重复。

标签: python


【解决方案1】:

两个sn-ps的关键区别是

>>> x[0] = "four"

>>> x = x + 1

在第一种情况下,您修改一个现有对象,在第二种情况下,您创建一个新对象。所以第一个 sn-p 有一个对象和两个名称,x 和 y,指代它,在第二个 sn-p 中有两个对象。请注意,这与列表的可变性(以及整数的不变性)无关,您可以将第二个 sn-p 写为

x = [1,2,3]
y = x 
x = x + [4]

并获得基本相同的结果(=两个不同的对象)。

【讨论】:

  • 那么this thread 的接受答案是错误的吗?回答者说这是因为可变性。
  • @Bentley4:是的,错了。
  • 除非我误解了 id(x) 的返回值,否则 x = x + [4] 似乎创建了一个新对象,而 x += [4] 没有。太棒了。
  • @KlausWarzecha:是的,对于列表添加!= iadd,请参阅stackoverflow.com/q/9766387/989121
  • @thg435:非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2013-07-17
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多