python对象:深入挖掘

vin*_*ita 3 python

大家好我知道这段代码的作用:

1.]我的第一个问题

x = 4 
y = x
Run Code Online (Sandbox Code Playgroud)

但是这个呢.为什么同样的地址甚至是这种情况?

x = 4
y = 4
id(x)
12345678
id(y)
12345678
Run Code Online (Sandbox Code Playgroud)

2.]我的第二个问题

x = 42 
y = x 
x = x + 1 
print x  # Prints 43
print y  # Prints 42


x = [1, 2, 3]
y = x
x[0] = 4
print x # Prints [4, 2, 3]
print y # Prints [4, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但为什么在名单的情况,都xy得到了由命令突变在一起x[0] = 4.
在这样的行为中,列表有什么不同?
是什么让他们表现得像这样?
最重要的是,这种行为的好处是什么?
为什么不能列出,变量,元组具有彼此的所有属性?

Ash*_*ary 8

  1. 在CPython缓存了小整数,这就是为什么他们的id是相同的.
  2. 整数是不可变的,因此修改(即将其分配给新对象)将不会影响其他引用.
  3. 列表是可变的,因此修改任何对可变对象的引用(就地修改)也会影响其他引用.
  4. 小字符串也可以具有相同的ID:

整数示例:

>>> x = 100
>>> y = x
>>> id(x),id(y)
(165193204, 165193204)
>>> x += 1
>>> id(x), id(y)    #`x` now points to a new object, `y` still points to the old object
(165193192, 165193204)
Run Code Online (Sandbox Code Playgroud)

  • "修改一个不会影响其他参考" - 你没有修改它.你用一个新的替换它. (3认同)