Python:什么时候通过引用传递变量,何时传值?

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

我的代码:

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

print locs
# prints => [ [1], [2] ]

为什么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 ?
  • loc必须包含最终的处理响应!
  • 我不想使用enumerate ,没有它可能吗?

  • Python中的所有东西都是按值传递和赋值的,就像所有东西都通过Java中的值传递和分配一样。 Python中的每个值都是一个对象的引用(指针)。 对象不能是值。 赋值总是复制值(这是一个指针); 两个这样的指针可以指向同一个对象。 对象从不复制,除非你明确地做了某些事情来复制它们。

    对于你的情况,循环的每次迭代都将列表的一个元素分配给变量loc 。 然后你可以给变量loc分配别的东西。 所有这些值都是指针; 你正在分配指针; 但是您不会以任何方式影响任何对象。


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

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

  • 当您进行x = 1000等赋值时,会创建一个字典条目,将当前名称空间中的字符串“x”映射到指向包含一千个整数对象的指针。
  • 当您使用x = 2000更新“x”时,会创建一个新的整数对象并更新字典以指向新对象。 旧的一千个对象是不变的(并且根据其他事物是否指向该对象,可能还可能不存在)。
  • 当您执行新的赋值(如y = x ,会创建一个新的字典条目“y”,指向与“x”条目相同的对象。
  • 像字符串和整数这样的对象是不可变的。 这只是意味着没有方法可以在创建对象后更改对象。 例如,一旦创建了一千个整数对象,它将永远不会改变。 数学是通过创建新的整数对象完成的。
  • 像列表这样的对象是可变的。 这意味着对象的内容可以通过指向对象的任何东西来改变。 例如, x = []; y = x; x.append(10); print y x = []; y = x; x.append(10); print y x = []; y = x; x.append(10); print y将打印[10] 。 空的列表已创建。 “x”和“y”都指向相同的列表。 append方法改变(更新)列表对象(就像向数据库添加记录一样),并且结果对“x”和“y”都可见(就像数据库更新对每个到该数据库的连接都可见)。
  • 希望能够为您澄清问题。


    它不能帮助Python从参考或值的角​​度来思考。 两者都不正确。

    在Python中,变量只是名称。 在for循环中, loc只是一个指向列表中当前元素的名称。 做loc = []简单地将名称loc重新绑定到不同的列表,只保留原始版本。

    但是因为在你的例子中,每个元素都是一个列表,你实际上可以改变这个元素,而这会反映在原始列表中:

    for loc in locs:
        loc[0] = loc[0] * 2
    
    链接地址: http://www.djcxy.com/p/20823.html

    上一篇: Python : When is a variable passed by reference and when by value?

    下一篇: How to declare global variables in Android?