python对象:深入挖掘

时间:2013-08-30 06:18:51

标签: python

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

1.]我的第一个问题

x = 4 
y = x

但是这个呢。为什么即使在这种情况下也会使用相同的地址?

x = 4
y = 4
id(x)
12345678
id(y)
12345678

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]

但为什么在列表的情况下,x和& y通过命令x[0] = 4一起变异。{ 在这样的行为中,列表有什么不同? 是什么让他们表现得像这样? 最重要的是这种行为的好处是什么? 为什么不能列出,变量,元组具有彼此的所有属性?

2 个答案:

答案 0 :(得分:8)

  1. 小整数是cached in CPython,这就是为什么他们的id是相同的。
  2. 整数是不可变的,因此修改(即将其分配给新对象)将不会影响其他引用。
  3. 列表是可变的,因此修改任何对可变对象的引用(就地修改)也会影响其他引用。
  4. 小字符串可以有same id's too
  5. 整数示例:

    >>> 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)
    

答案 1 :(得分:2)

您的第一个问题可以通过内存优化来解决。如果你进一步挖掘,例如:

x = 4
y = 4
# Both (may) have the same id
x += 1
# id of x and y will now be different

第二个是引用语义。由于Python中几乎所有内容都是引用,因此设置x = y只是将指向y指向x指向的同一事物。如果你真的想要一个完全独立的副本,你需要这样说:

x = [1, 2, 3, 4]
y = x[:]
x[0] = 5
y
>>> [1, 2, 3, 4]