python list对象无法连续调用extend或append方法,报错‘NoneType‘ object has no attribute ‘extend‘

a=[1,2]
b=[3,4]
c=[5,6]
a.extend(b).extend(c)

运行后报错:

a.extend(b).extend(c)
AttributeError: 'NoneType' object has no attribute 'extend'

我百思不得其解,因为

s="hello world"
print(s.replace("hello","haha").replace("world","word"))
# [out]:haha word

进行

print(x=a.extend([1,2]))
# [out]: 

原来是列表a调用方法extend后返回了一个None(方式1)

(下面的在玩,熟悉python请直接移步文尾)

为了研究OOP的一些特点,我继续做实验:
猜想,obj.meth1().meth2()的实现过程为(方式2)
(其实是进一步通过__dict__,__getattr__,__getattribute__,__class__等获取并返回的)

meth1_ret=obj.meth()
meth1_ret.meth2()
class Spam:
    def meth1(self):
        print("Call meth1")
        return self
    def meth2(self):
        print("Call meth2")
        return None
spam=Spam()
spam.meth1().meth2()  #success
spam.meth2().meth1()  #AttributeError: 'NoneType' object has no attribute 'meth1'

我们再看一下方式2和方式2速度对比:

class Spam:
    def meth1(self):
        print("Call meth1")
        [str(x) for x in range(1, 1000000)]
        return self
    def meth2(self):
        print("Call meth2")
        [str(x) for x in range(1, 1000)]
        return None
spam=Spam()


import time as t
res=[]
def test_speed():
    start=t.time()
    spam.meth1().meth2()    #方法1
    middle=t.time()
    m=spam.meth1()          #方法2
    m.meth2()
    end=t.time()
    if middle-start>end-middle:res.append(1)
[test_speed() for i in range(1,100)]
print(len(res))

第一次实验方法1胜出57回,第二次胜出44回,目前来看性能无太大差别。。。想着也是,不就创建个变量名嘛。
内存测试:

from memory_profiler import profile

def one(): #方法1
    spam.meth1().meth2()

def two(): #方法2
    m=spam.meth1()
    print(id(m),id(spam.meth1()))
    m.meth2()
@profile(precision=10)
def run():
    one()
    two()
    one()
run()
"""
Line #    Mem usage    Increment  Occurences   Line Contents
============================================================
    22  54.4335937500 MiB  54.4335937500 MiB           1   @profile(precision=10)
    23                                         def run():
    24  54.4335937500 MiB   0.0000000000 MiB           1       one()
    25  54.4335937500 MiB   0.0000000000 MiB           1       two()
    26  54.4335937500 MiB   0.0000000000 MiB           1       one()
"""

经过内存测试发现也无差别,因为对象一直在,都在同指向同一块内存。(其实我怀疑是我不会测试)。
。。。。。速度内存测试好像搞错测试方法了。。。太菜了。。。



那为什么extend不返回一个对象呢?
难道是性能?难道是内存?
不不不,

我觉得归根到底还是str是不可变类型,list是可变类型。

a.append("22").append("22") #一样报错

世界那么乱,return给谁看? ------本弱鸡宣言

在你提供的引用中,没有提到"average"属性的具体情况。然而,根据你的描述,"AttributeError: Tensor object has no attribute average"错误通常是因为尝试在一个没有"average"属性的张量上调用该属性导致的。要解决这个问题,你可以检查代码中使用该属性的地方,并确保你正在操作具有"average"属性的正确对象。此外,还可以查看相关库的文档或论坛以获取有关该属性的更多信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [AttributeError: ‘Tensor‘ object has no attribute ‘bool](https://blog.csdn.net/anshiquanshu/article/details/117445334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python报错: list object has no attribute shape的解决](https://download.csdn.net/download/weixin_38748721/13708867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [AttributeError: ‘Tensor‘ object has no attribute ‘_keras_history‘报错解决](https://blog.csdn.net/qq_35874169/article/details/123795395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值