![]() |
1
2412
论点是 passed by assignment . 这背后的理由是双重的:
所以:
为了更清楚地说明这一点,我们来举几个例子。 列表-可变类型让我们尝试修改传递给方法的列表:
输出:
因为传入的参数是对
现在让我们看看当我们试图更改作为参数传入的引用时会发生什么:
输出:
自从
字符串-不可变类型它是不可变的,所以我们无法更改字符串的内容。 现在,让我们尝试更改引用
输出:
又一次,自从
我希望这能把事情弄清楚一点。 编辑: 有人指出,这并不能回答@david最初提出的问题,“我是否可以通过实际引用传递变量?”我们来研究一下。 我们怎么解决这个问题?正如@andera的答案所示,您可以返回新值。这不会改变传递信息的方式,但会让您获得想要返回的信息:
如果您真的想避免使用返回值,可以创建一个类来保存您的值并将其传递到函数中,或者使用现有的类,如列表:
虽然这看起来有点麻烦。 |
![]() |
2
581
问题来自对Python中的变量的误解。如果你习惯了大多数的传统语言,你就有了一个心理模型,可以按照以下顺序进行:
你相信吗?
当使用参数调用函数时,将创建一个引用传入对象的新引用。这与函数调用中使用的引用不同,因此无法更新该引用并使其引用新对象。在您的示例中:
唯一的方法是传递一个可变的对象。因为这两个引用引用同一个对象,所以对该对象的任何更改都会反映在这两个地方。
|
![]() |
3
268
|
![]() |
4
224
它既不是传递值也不是传递引用-它是由对象调用的。见Fredrik Lundh: http://effbot.org/zone/call-by-object.htm 这是一个重要的引述:
在您的示例中,当
|
![]() |
5
150
想想被传递的东西 按赋值 而不是通过引用/值。这样,只要你理解在正常作业中发生的事情,一切都很清楚。 因此,当将列表传递给函数/方法时,该列表被分配给参数名。附加到列表将导致列表被修改。重新分配列表 里面 函数不会更改原始列表,因为:
由于不能修改不可变类型,因此它们 似乎 就像通过值传递-将int传递给函数意味着将int分配给函数参数。您只能重新分配它,但它不会改变原始变量的值。 |
![]() |
6
57
effbot(又名fredrik lundh)将python的变量传递样式描述为按对象调用: http://effbot.org/zone/call-by-object.htm 对象在堆上分配,指向它们的指针可以在任何地方传递。
希望你能澄清这个问题。 |
![]() |
7
55
技术上, python总是使用pass-by引用值 . 我要重复一遍 my other answer 支持我的声明。 python总是使用传递引用值。没有例外。任何变量赋值都意味着复制引用值。也不例外。任何变量都是绑定到引用值的名称。总是。 可以将引用值视为目标对象的地址。地址在使用时自动取消引用。这样,使用引用值时,您似乎直接使用目标对象。但是在两者之间总是有一个参照物,要跳到目标上还要多走一步。 下面的示例证明了Python使用了按引用传递:
如果参数是按值传递的,则外部
你可以使用
在编译语言中,变量是能够捕获类型值的内存空间。在Python中,变量是绑定到保存目标对象引用值的引用变量的名称(在内部捕获为字符串)。变量的名称是内部字典中的键,该字典项的值部分存储对目标的引用值。 引用值隐藏在python中。没有任何用于存储引用值的显式用户类型。但是,可以使用一个列表元素(或任何其他合适容器类型中的元素)作为引用变量,因为所有容器都将元素存储为对目标对象的引用。换句话说,元素实际上不包含在容器中——只有对元素的引用才是。 |
![]() |
8
41
我通常使用的一个简单技巧是将它包装在一个列表中:
(是的,我知道这很不方便,但有时做起来很简单。) |
![]() |
9
35
(编辑-布莱尔更新了他广受欢迎的答案,使其准确无误) 我认为重要的是要注意到,目前获得最多选票的职位(布莱尔·康拉德),虽然其结果是正确的,但具有误导性,并且根据其定义是不正确的。虽然有许多语言(如C)允许用户通过引用或传递值,但python不是其中之一。 大卫·库尔纳波的回答指向了真实的答案,并解释了为什么布莱尔·康拉德的文章中的行为似乎是正确的,而定义却不正确。 如果python是传递值,那么所有语言都是传递值,因为必须发送一些数据(无论是“值”还是“引用”)。然而,这并不意味着在C程序员会想到的意义上,python是传递值。 如果你想这样做,布莱尔·康拉德的回答很好。但是如果你想知道为什么python既不是传递值,也不是传递引用,那么请阅读大卫·库纳波的答案。 |
![]() |
10
32
python中没有变量理解参数传递的关键是停止思考“变量”。在python中有名称和对象,它们在一起 看起来像变量,但总是区分这三个变量是有用的。
这就是一切。易变性与这个问题无关。 例子:
这将绑定名称
这将绑定名称
所以在问题中所示的代码中,
|
![]() |
11
23
你得到了一些很好的答案。
|
![]() |
12
17
在这种情况下,变量标题为
我相信其他人可以进一步澄清这一点。 |
![]() |
13
15
Python E-Sy-By赋值方案与C++AES的参考参数选项完全相同,但实际上与C语言(和其他语言)的参数传递模型非常类似:
|
![]() |
14
15
正如您所说,您需要有一个可变的对象,但让我建议您检查全局变量,因为它们可以帮助您甚至解决此类问题! 例子:
|
![]() |
15
12
这里有很多关于答案的见解,但我认为这里没有明确提到另外一点。从python文档引用 https://docs.python.org/2/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python “在python中,只在函数内部引用的变量是隐式全局的。如果在函数体的任何位置为变量分配了一个新值,则该变量假定为局部变量。如果在函数中为变量分配了新值,则该变量是隐式局部变量,您需要将其显式声明为__global_。 虽然一开始有点令人惊讶,但片刻的思考解释了这一点。一方面,为指定的变量要求全局性可以提供一个防止意外副作用的条。另一方面,如果所有全局引用都需要全局引用,则始终使用全局引用。您必须将对内置函数或导入模块组件的每个引用声明为全局引用。这种混乱将破坏全球声明识别副作用的有效性。” 即使将可变对象传递给函数,这仍然适用。对我来说,清楚地解释了分配给对象和在函数中操作对象之间行为差异的原因。
给予:
因此,对未声明为全局的全局变量的赋值将创建一个新的本地对象,并断开与原始对象的链接。 |
![]() |
16
9
这是对这个概念的简单(我希望)解释
正在传递实际对象-[0,1](在其他编程语言中称为值)。所以实际上函数
这显然不会改变传递给函数的对象。如果函数如下所示:
然后调用将导致:
这显然会改变物体。 This answer 解释得很好。 |
![]() |
17
8
除了所有关于这些东西如何在Python中工作的很好的解释之外,我没有看到一个简单的关于这个问题的建议。就像创建对象和实例一样,处理实例变量和更改实例变量的方法如下:
在实例方法中,通常指
另一种解决方案是创建这样的静态方法:
|
![]() |
18
6
有一个小技巧可以通过引用传递一个对象,即使语言不能使之成为可能。它也在Java中工作,它是带有一个项目的列表。;-)
这是一个丑陋的黑客,但它起作用。-P |
![]() |
19
4
我使用以下方法快速地将两个Fortran代码转换为python。是的,当最初的问题被提出时,它不是通过引用传递的,但在某些情况下是一个简单的工作。
|
![]() |
20
3
虽然pass-by引用不适合python,而且很少使用,但有一些解决方法可以实际工作,以使对象当前分配给局部变量,甚至从被调用函数内部重新分配局部变量。 其基本思想是拥有一个可以进行访问的函数,并且可以作为对象传递到其他函数或存储在类中。
一种方法是使用
同样的想法也适用于阅读和
对于只是阅读,甚至还有一种更短的方法来使用
传递3个包装器来访问变量有点难,因此可以将这些包装器包装到具有代理属性的类中:
pythons的“反射”支持使获得一个对象成为可能,该对象能够在给定范围内重新分配名称/变量,而无需在该范围内显式定义函数:
这里
|
![]() |
21
3
考虑到python处理值和引用它们的方式,引用任意实例属性的唯一方法是按名称:
当然,在真正的代码中,您可以在dict查找中添加错误检查。 |
![]() |
22
2
由于您的示例恰好是面向对象的,因此您可以进行以下更改以获得类似的结果:
|
![]() |
23
2
Python中的PASS引用与C++/Java中的按引用传递概念有很大的不同。
|
![]() |
24
0
你只能用 空类 作为实例存储引用对象,因为内部对象属性存储在实例字典中。请参见示例。
|
![]() |
Tono Nam · 无法在golang中通过引用修改对象 3 年前 |
![]() |
uzivanky · 课堂上不同的“this” 7 年前 |
![]() |
Henry Marshall · 通过引用替换JS对象[重构工作代码] 7 年前 |
|
user9441223 · 通过引用传递对象并将其存储为成员变量 7 年前 |
![]() |
Enryu · 参考变量参数vs局部参考变量[关闭] 7 年前 |
![]() |
Tryer · 计算不同类别对象的数量 7 年前 |