我遇到过一种情况,我认为这种情况在理解引用如何在Python中工作方面存在差距.
假设我们有两个类:
class A:
def __init__(self):
self.x = [1,2,3]
def modify(self):
self.x.append(4)
def reset(self):
self.x = []
class B:
def __init__(self, x):
self._x = x
def say(self):
print self._x
a = A()
b = B(a.x)
b.say()
a.modify()
b.say()
a.reset()
b.say()
Run Code Online (Sandbox Code Playgroud)
我预期的输出是:
[1, 2, 3]
[1, 2, 3, 4]
[]
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
似乎当我打电话reset()并设置self.x为新列表时,所持有的引用B变得独立并继续存在,从而成为副本而不是引用.这是正确的理解吗?
Sve*_*ach 10
该reset()方法
def reset(self):
self.x = []
Run Code Online (Sandbox Code Playgroud)
不会修改存储的对象self.x- 而是创建一个新的空列表,然后存储在其中self.x.旧列表不会被更改(因为它仍然被引用b._x,它也不会被垃圾回收).要获得您所追求的行为,请使用
def reset(self):
del self.x[:]
Run Code Online (Sandbox Code Playgroud)
清空现有列表而不是创建新列表.
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |