什么是列表方法之间的差异append()和extend()?
list = [1, 2, 3]
print list.append(4) ## WRONG, print does not work, append() returns None
## RIGHT:
list.append(4)
print list ## [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我正在学习Python,我不确定这个问题是否特定于语言以及如何在Python中实现append.
为什么python 2.5.2具有以下行为
>>>[2].extend([]) == [2]
False
>>> [2].extend([]) == None
True
$ python --version
Python 2.5.2
Run Code Online (Sandbox Code Playgroud)
我假设我在这里不理解某些东西,但直觉上我认为[2] .extend([])应该产生[2]
如果我要运行此代码:
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
Run Code Online (Sandbox Code Playgroud)
为什么它会返回['yes'],即使我没有直接更改变量'example',我怎么能修改代码以便'example'不受函数的影响?
在Python中,尝试使用循环对列表执行最基本的追加功能:不确定我在这里缺少的内容:
a=[]
for i in range(5):
a=a.append(i)
a
Run Code Online (Sandbox Code Playgroud)
收益:
'NoneType' object has no attribute 'append'
我试图理解扩展如何在Python中工作,它并没有完全按照我的期望.例如:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6].extend(a)
>>> b
>>>
Run Code Online (Sandbox Code Playgroud)
但我原以为:
[4, 5, 6, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
为什么返回None而不是扩展列表?
在我看来,我觉得list1.extend(list2)和list1.append(num)应该返回突变列表,而不是None(无效).除了具有破坏性地改变原始列表的副作用.
这个问题的关键是帮助单元测试.如果我有一个繁忙的__init__(即__init__复杂的初始化),我不能简单地实例化一个类的对象,但我需要模拟/存根调用在依赖关系中的所有方法__init__.
为了说明这个问题,这里是一个例子:
class SomeClass(object):
def __init__(self, dep1, dep2, some_string):
self._dep1 = dep1
self._dep2 = dep2
self._some_string = some_string
# I would need to mock everything here (imagine some even more
# complicated example)
for dep2element in self._dep2:
dep2element.set_dep(dep1)
self._dep1.set_some_string(some_string)
def fun1(self):
...
def fun2(self):
...
def fun3(self):
...
Run Code Online (Sandbox Code Playgroud)
要测试这些fun*功能,每个测试都必须执行复杂的构造.
class TestSomeClass(TestCase):
def create_SomeClass(self, some_string):
dep1 = Mock()
# mock everything required by SomeClass' constructor
dep2 = Mock()
# mock everything required by …Run Code Online (Sandbox Code Playgroud) 今天我花了大约20分钟试图弄清楚为什么它按预期工作:
users_stories_dict[a] = s + [b]
Run Code Online (Sandbox Code Playgroud)
但这会有一个None价值:
users_stories_dict[a] = s.append(b)
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么append函数不返回新列表?我正在寻找做出这个决定的某种合理理由; 它现在看起来像是一个Python新手.
我对导致这种情况的思维过程感兴趣.对我来说,一个相对新手,似乎阻碍了,因为它阻止了列表处理的"链接"(例如mylist.reverse().append('a string')[:someLimit]).我想可能是"那些人的力量"决定列表理解是一个更好的范例(一个有效的观点),所以不想鼓励其他方法 - 但是这似乎有悖常理,以防止一种直观的方法,即使更好存在替代品.
请注意,我不是在抱怨(我敢肯定有是一个合理的理由,我在它是什么只是感兴趣!),也不是寻找一个解决方案(意见在这里非常具有启发性) -只是寻找一些情况下,并深入理解语言的设计过程.