Python:何时是通过引用传递的变量和何时按值传递?

Yug*_*dle 30 python reference pass-by-reference pass-by-value

可能重复:
Python:如何通过引用传递变量?

我的代码:

locs = [ [1], [2] ]
for loc in locs:
    loc = []

print locs
# prints => [ [1], [2] ]
Run Code Online (Sandbox Code Playgroud)

为什么loc不参考元素locs

Python:除非明确复制,否则所有内容都将作为引用传递[这不是真的吗?]

请解释.. python如何决定引用和复制

更新:

怎么做 ?

def compute(ob):
   if isinstance(ob,list): return process_list(ob)
   if isinstance(ob,dict): return process_dict(ob)

for loc in locs:
   loc = compute(loc)  # What to change here to make loc a reference of actual locs iteration ?
Run Code Online (Sandbox Code Playgroud)
  • locs必须包含最终处理的响应!
  • 我不想用enumerate,没有它可能吗?

Ray*_*ger 53

Effbot(又名Fredrik Lundh)将Python的变量传递样式描述为逐个调用对象:http: //effbot.org/zone/call-by-object.htm

对象在堆上分配,指向它们的指针可以在任何地方传递.

  • 当您进行诸如的分配时x = 1000,会创建一个字典条目,将当前名称空间中的字符串"x"映射到指向包含一千个整数对象的指针.
  • 使用时更新"x"时x = 2000,将创建一个新的整数对象,并更新字典以指向新对象.旧的一千个对象没有变化(可能存在也可能不存在,具体取决于是否有其他任何东西引用该对象).
  • 当您执行新的分配时y = x,会创建一个新的字典条目"y",该条目指向与"x"条目相同的对象.
  • 像字符串和整数这样的对象是不可变的.这只是意味着没有方法可以在创建对象后更改对象.例如,一旦创建了整数对象一千,它就永远不会改变.通过创建新的整数对象来完成数学.
  • 像列表这样的对象是可变的.这意味着可以通过指向对象的任何内容来更改对象的内容.例如,x = []; y = x; x.append(10); print y将打印[10].空列表已创建."x"和"y"都指向同一个列表.该追加方法变异(更新)列表中的对象(如添加一条记录到数据库),结果是这两个"X"和"Y"看得见的(就像一个数据库更新将每一个连接到该数据库中可见).

希望能为您澄清问题.


new*_*cct 24

Python中的所有内容都按值传递和分配,就像在Java中传递所有内容并按值分配一样.Python中的每个值都是对象的引用(指针).对象不能是值.赋值总是复制值(这是一个指针); 因此,两个这样的指针可以指向同一个对象.除非您正在做一些明确的复制对象,否则永远不会复制对象.

对于您的情况,循环的每次迭代都会将列表的元素分配给变量loc.然后,您可以为变量分配其他内容loc.所有这些值都是指针; 你正在分配指针; 但是你不会以任何方式影响任何物体.

  • @AndrewS:也许他们是一样的,也许他们不是。为什么这有关系?这与可变性或赋值语义无关。 (2认同)

Dan*_*man 8

Python在参考或值方面的思考并没有帮助.两者都不正确.

在Python中,变量只是名称.在for循环中,loc只是一个指向列表中当前元素的名称.这样做loc = []只是重新绑定名称loc为不同的列表,只留下原来的版本.

但是,因为在您的示例中,每个元素都是一个列表,您实际上可以改变该元素,并且这将反映在原始列表中:

for loc in locs:
    loc[0] = loc[0] * 2
Run Code Online (Sandbox Code Playgroud)

  • 阅读*Idiomatic Python*可能会有所帮助 - ["其他语言有变量,Python有标签."](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other- language-have-variables)其余的也是很好的阅读.;) (2认同)

Joh*_*ooy 5

当你说

loc = []
Run Code Online (Sandbox Code Playgroud)

您正在将loc变量重新绑定到新创建的空列表

也许你想要

loc[:] = []
Run Code Online (Sandbox Code Playgroud)

哪个将loc的一个切片(恰好是整个列表)分配给空列表

  • 我相信这最后一个例子是 OP 正在寻找的! (2认同)