博客信息

Python核心编程(==与is区别、深浅复制、原码反码补码、property装饰器)

发布时间:『 2019-07-30 04:40』  博客类别:Python  阅读(750)

==is之小整数问题

IDEA is进行了特殊处理,原来小整数(-5·256)应该为false

 

==is之对象问题


小李飞刀_Python

相关代码

# ==与is之小整数问题
a = 1000
b = 1000
print(a==b)
# IDEA 对is进行了特殊处理,原来小整数(-5·256)应该为false
print(a is b)

# ==与is之对象问题
c=[1,2]
d=[1,2]
print(c==d)
# false
print(c is d)


深浅复制

对于基本数据类型深浅赋值没有啥区别,为了体现深浅赋值的区别,这里我们以嵌套list为例;

 

浅复制:重新开辟了一个空间,将地址赋给克隆对象,但是新空间中的引用地址还是源空间的,并没有创建新的;

 

深复制:重新开辟空间的同事,将空间内部的引用地址对应的对象也拷贝了一份,引用地址也就变了;

 

结论:深复制更耗内存,但是因为空间是独立了,在特别的应用场景会被用到;

 

 

图解:


小李飞刀_Python


代码:


import copy
list1=[[1,2],[3,4]]
list2 = copy.copy(list1)

# 浅赋值
print(id(list1))
print(id(list2))
print(list1 is list2)
print(id(list1[0]))
print(id(list2[0]))
print(list1[0] is list2[0])

# 39805448
# 44905864
# False
# 44905800
# 44905800
# True

list3 = copy.deepcopy(list1)
print(id(list1))
print(id(list3))
print(list1 is list3)
print(id(list1[0]))
print(id(list3[0]))
print(list1[0] is list3[0])

# 39805448
# 45004104
# False
# 44905800
# 36063048
# False


原码反码补码


5-4
4的源码
0000 0100
-4的源码
1000 0100
反码
1111 1011
补码=反码+1
1111 1011+
0000 0001
1111 1100

5的源码
0000 0101

5-4
0000 0101+
1111 1100
-------------------
0000 0001

所以最后的结果是1


属性问题

Python中命名规范问题:

xx

    普通的变量

_x

    使用from 模块 import *  无法导入

 

__x

    私有属性,方法

    名字重整:

        __age

        _类名__age

 

__xx__:

    魔法方法

    自定义的方法避免使用这种形式

 

x_:

    避免变量名字冲突

property装饰器的基本使用

被装饰器装饰的私有变量可以被外界访问

 

相关代码

装饰器使用方式一:


"""
property:简化私有属性的访问方式

"""
class Student():
    def __init__(self,name,age):
        self.name = name
        self.setAge(age)
    def getAge(self):
        return self.__age
    def setAge(self,age):
        if isinstance(age,int):
            self.__age = age
        else:
            raise TypeError('年龄必须是int类型')

    age = property(getAge,setAge)

stu = Student('aaa',10)
# stu.setAge(20)
stu.age = 20
# print(stu.getAge())
print(stu.age)


装饰器使用方式二:

"""
装饰器
"""
class Student():
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    @property
    def xxx(self):
        return self.__age
    @xxx.setter
    def xxx(self,age):
        if isinstance(age,int):
            self.__age = age
        else:
            raise TypeError('年龄必须是int类型')

stu = Student('学生1',10)
#设置年龄
stu.__age = 20
print(stu.__age)

list1 = [x for x in range(100) if x % 2 == 0]
print(list1)



over......


关键字:     Python       核心编程  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有