zoukankan      html  css  js  c++  java
  • python编码小记

    Python编码小记

    标签(空格分隔): 编程 python


    1.list类型remove()操作

    列表对象执行remove()函数后,会自动退出循环,所以如果想利用一个单独的for循环删除列表中多个成员,是办不到的,可尝试使用多重循环。
    例如下面的代码:

    for item in test_list:
        if item == 0:
            test_list.remove(item)
    

    如果test_list中为0的项多于两个,那么此循环在删除第一个0后便会退出循环,无法利用一个循环删除其中所有为零的项!字典也是如此。细想想,应该是remove后test_list发生了变化,无法继续迭代。

    2.对元素为对象的list(或dict)进行deepcopy

    如果一个列表或字典中,有元素为类对象(列表或字典中保存的应是对象的引用),那么用copy模块中deepcopy()进行拷贝后,相应引用地址会发生变化,相当于是类利用相同参数初始化的不同实例。

    class Driver(object):
        def __init__(self, name):
            self.name = name
            ......
    ......
    driver_list = []
    driver1 = Driver('str1')
    driver2 = Driver('str2')
    driver_list.append(driver1)
    driver_list.append(driver2)
    copy_list = deepcopy(driver_list)
    for item in driver_list:
        if item.name == 'str1':
            copy_list.remove(item)
    ......
    

    在执行到最后的for循环中remove语句时,会提示列表中找不到对象。原因就是在deepcopy时对Driver类对象也进行了复制,复制产生的copy_list中项与原来driver_list中项,分配内存地址定然不同,而相应列表中存放的都是他们的引用(也就是地址),在copy_list中找不到相应元素也就顺理成章了。

    3.可变对象与不可变对象

    先看如下几行代码:

    str1 = ' This is my test! '
    list1 = ['this', 'is', 'my', 'test', ' ']
    str1.strip()
    for item in str1.split(' '):
            .......
    list2 = list1.remove(' ')[:2]
    

    这段代码在执行时,line.3中str1执行了strip()后的值并未保存,str1值不变, for循环中 item还是会取到两个空值。line.6执行会报错TypeError,因remove()后无返回值,相当于对NoneType型对象切分。
    究其原因就是因为可变对象与不可变对象的区分。字符串、元组、数字等均是不可变对象,字符串strip()后会产生一个新字符串,原变量str1的值不会改变,必须保存下新字符串才能使用;而列表、字典等可变对象,执行remove()等函数(不会有返回值)改变其值后,原变量值就已经改变,可直接使用原变量。
    正确代码:

    str2 = str1.strip()
    for item in str2.split(' '):
        .......
    list1.remove(' ')
    list2 = list1[:2]
    
  • 相关阅读:
    nginx 负载均衡
    nginX 安装 启动
    nginx 简介
    使用ASDM 管理 ciscoASA设备
    OSPF配置实验(一)
    VRRP
    HSRP 详解
    Rip 动态路由协议
    配置ASA防火墙 远程管理方式
    Oracle 重启监听
  • 原文地址:https://www.cnblogs.com/qiyukun/p/4754095.html
Copyright © 2011-2022 走看看