如果我定义
foo = [[1,2],[2,3],[3,4]]
bar = foo
那么 foo 和 bar 引用同一个对象,即 [[1,2],[2,3],[3,4]]。我现在可以使用这些“标签/命名空间/引用”中的任何一个来更改对象 [[1,2],[2,3],[3,4]],但这对任何人有什么用处?
如果我定义
foo = [[1,2],[2,3],[3,4]]
bar = foo
那么 foo 和 bar 引用同一个对象,即 [[1,2],[2,3],[3,4]]。我现在可以使用这些“标签/命名空间/引用”中的任何一个来更改对象 [[1,2],[2,3],[3,4]],但这对任何人有什么用处?
将名称重新绑定到现有值可能有用的一个原因是,如果您打算为不同的对象重用原始名称。例如,这个计算n
斐波那契数列中第 th 个数的函数重用了名称a
,b
并temp
在循环中重复,每次将先前引用的值绑定a
到(通过 temp):b
def fib(n):
a = 1
b = 0
for _ in range(n):
temp = a
a = a+b
b = temp
# A more Pythonic version of the last three lines would be: a, b = a+b, a
return b
假设我有一个类实例的属性frobnoz
,一个对类实例的引用,该类实例Frobnoz
又是一个属性marfoos
,它是所有相关联的 marfoos 的列表,我想对第一个执行几个操作。
marfoo = self.frobnoz.marfoos[0]
marfoo.rotate(CLOCKWISE, degrees=90)
if marfoo.is_cloudy():
self.purge_clouds(marfoo)
如果无法创建对我想要对其执行操作的 marfoo 的附加引用,我不仅必须对它进行冗长的引用,而且还会产生查找frobnoz
和marfoos
引用以及第一个元素的费用每次我想使用它时都在列表中。
它对于修改值的函数调用很有用(除其他外):
def changeFoo(bar):
bar[0][0]=3.14
changeFoo(foo)
注意:这在技术上并不使用赋值,但它是等价的。
当多个对象需要引用同一个对象时(例如在链表中),也可以使用它。