【发布时间】:2020-06-01 02:15:05
【问题描述】:
我有如下代码,
attractions = [[] for i in range(5)]
def add_attraction(attraction):
attractions_for_destination = attractions[2]
attractions_for_destination.append(attraction)
return
通过引用发生在第 3 行“attractions_for_destination =tractions[2]”。我所拥有的按引用传递的一般想法是它发生在实际参数和形式参数之间。但是上面一行是一个简单的赋值代码。可以在简单的赋值代码中进行引用传递吗?
如果是这样,如果我写
attractions_for_destination = attractions[2] + ": best attraction site"
更改值会强制新创建的变量使用新的内存空间吗?
【问题讨论】:
-
欢迎来到 SO!我不确定这里问的是什么,或者我是否遵循这个问题。 Python从不通过引用传递,它是通过值传递,对于初学者来说,所以我不明白对数组元素的赋值与新的内存空间有什么关系。当然,变量 param 引用了一个对象,并且像这样改变元素的值会改变内存,但这似乎有点微不足道。你能澄清一下吗?
-
Python 从不使用按引用传递。绝不。 Python 使用单一评估策略,它既不是按引用调用也不是按值调用。它使用"call by object sharing",虽然它有很多不同的名称,但有时您也会听到“按任务调用”。
-
@ggorlen 绝对不是,Python 不是按值传递的。如果是,参数将被复制。如果我这样做了:
def foo(x): x.append(42)然后y = []; foo(y); print(y)将打印[] -
这种情况下的值是一个对象引用,很像Java,它是按值传递的,但对象从不被复制到调用中。变量 is 被复制,但它是对 obj 的引用。
x是堆栈帧的本地地址——如果你将x重新分配给其他东西,它会停止“指向”它所代表的对象。我们这里肯定有 2 个变量,x和y,它们都指向同一个 obj。我绝不是建议您展示的代码在 Python 中是可能的,这根本不是我对按值传递的理解。 -
我认为我们说的是同一件事(来自链接的文章):“但是,“共享调用”这个术语并不常用;该术语在不同来源之间不一致。例如,在 Java 社区中,他们说 Java 是按值调用的。”这正是我的意思。