Python 2:函数没有更改列表数据

时间:2013-08-14 11:20:09

标签: python list function python-2.7

我的Python 2程序存在一个小问题。

这是我的功能:

def union(q,p):
      q = q + p
      q = set(q)
      return q, p

然后我创建了新的两个列表并调用了我的函数:

a = [1,2,3]
b = [2,4,6]
union(a,b)

最后我打印出ab

>>>print a
[1,2,3]
>>>print b
[2,4,6]

正如您所看到的,我的功能并没有改变a的值。为什么?我该如何解决这个问题?我做错了什么?

注意: a曾是[1,2,3,4,6]而不是[1,2,3]

感谢。

5 个答案:

答案 0 :(得分:3)

将返回值分配回ab

>>> def union(q,p):
...       q = q + p
...       q = set(q)
...       return q, p
... 
>>> a = [1,2,3]
>>> b = [2,4,6]
>>> a, b = union(a, b)
>>> a
set([1, 2, 3, 4, 6])
>>> b
[2, 4, 6]

要从集合中获取列表,请使用list作为Haidro评论:

>>> list(a)
[1, 2, 3, 4, 6]

答案 1 :(得分:2)

您的功能不会在适当的位置更改它,它会返回新项目。因此,您必须将结果返回到变量:

a, b = union(a, b)

答案 2 :(得分:2)

您的函数永远不会改变a中的对象。要么改变它,要么将函数返回的值赋给它。

答案 3 :(得分:0)

虽然原则是相同的,但这是实现它的另一种方式。

>>> def union(a,b):
...     a = set(a) | set(b)
...     return a,b
... 
>>> a = [1,2,4]
>>> b = [5,7,8]
>>> a,b = union(a,b)
>>> a
set([1, 2, 4, 5, 7, 8])
>>> b
[5, 7, 8]
>>> list(a)
[1, 2, 4, 5, 7, 8]

答案 4 :(得分:0)

正如其他答案所述,您必须指定union返回的内容。这是因为在union内你没有修改q,你创建了一个新的局部变量(恰好也称为q)。

如果你想修改作为参考传递的内容,你必须:

def union_mod(q, p):
  q.extend(p)
  return set(q), p

现在,你传递的q被修改了(它将继续是一个列表,不能改变类型)。所以:

In [1]: a = [1,2,3]

In [2]: b = [2,4,6]

In [3]: def union_mod(q, p):
   ...:     q.extend(p)
   ...:     return set(q), p
   ...: 

In [4]: union_mod(a,b)
Out[4]: (set([1, 2, 3, 4, 6]), [2, 4, 6])

In [5]: a
Out[5]: [1, 2, 3, 2, 4, 6]

In [6]: b
Out[6]: [2, 4, 6]