我的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)
最后我打印出a
和b
:
>>>print a
[1,2,3]
>>>print b
[2,4,6]
正如您所看到的,我的功能并没有改变a
的值。为什么?我该如何解决这个问题?我做错了什么?
注意: a
曾是[1,2,3,4,6]
而不是[1,2,3]
感谢。
答案 0 :(得分:3)
将返回值分配回a
和b
:
>>> 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]