返回顶部

1- 探究细节

import导入模块

1. import 搜索路径

import sys
sys.path

路径搜索

  • 从上面列出的目录里依次查找要导入的模块文件

  • ' ' 表示当前路径

程序执行时导入模块路径
sys.path.append('/home/itcast/xxx')
sys.path.insert(0, '/home/itcast/xxx')    #可以确保先搜索这个路径

2. 重新导入模块

模块被导入后,import module不能重新导入模块,重新导入需用

测试模块内容 

调用模块中的方法

 

修改测试模块 

重新加载模块 

作用域

什么是命名空间

随便喊一声“美女”,看看有多少人回头

比如有一个学校,有10个班级,在7班和8班中都有一个叫“小王”的同学,如果在学校的广播中呼叫“小王”时,7班和8班中的这2个人就纳闷了,你是喊谁呢!!!如果是“7班的小王”的话,那么就很明确了,那么此时的7班就是小王所在的范围,即命名空间

test.py

num = 200
def print_num():
    print("----print_num func, num=%d----"%num)

main.py 

from test import *
num = 100

def print_num2():
    print("----print_num2 func, num=%d----"%num)

print_num()#调用test命名空间中的print_num函数,它会使用test命名空间中的全局变量
print_num2()#调用当前命名空间中print_num2函数,它会使用当前命名空间中的全局变量

 

 运行python3 main.py结果如下:

 

----print_num func, num=200----
----print_num2 func, num=100----

  

globals、locals

 在之前学习变量的作用域时,经常会提到局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域

locals

 globals

==、is

>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False

 

 

总结

  • is 是比较两个引用是否指向了同一个对象(引用比较)。
  • == 是比较两个对象的值是否相等(值比较)。

对象值比较(==)的定义

 

class Person(object):
    def __init__(self, name):
        self.name = name

p1 = Person("王胖胖")
p2 = Person("王胖胖")

print("p1 == p2: %s" % (p1 == p2))  # False
print("p1 is p2: %s" % (p1 is p2))  # False
View Code

定义__eq__方法,重新实现==比较方法

class NewPerson(object):
    def __init__(self, name):
        self.name = name

    def __eq__(self, person_obj):
        """执行==时调用的方法"""
        return self.name == person_obj.name

np1 = NewPerson("王胖胖")
np2 = NewPerson("王胖胖")

print("np1 == np2: %s" % (np1 == np2))  # True
print("np1 is np2: %s" % (np1 is np2))  # False
View Code

 

 

深拷贝、浅拷贝

1. 浅拷贝 copy.copy

  • 浅拷贝是对于一个对象的顶层拷贝

通俗的理解是:拷贝了引用,并没有拷贝内容

 

2. 深拷贝 copy.deepcopy

  • 深拷贝是对于一个对象所有层次的拷贝(递归)

 

3. 注意点

浅拷贝对不可变类型和可变类型的copy不同

 使用copy模块功能的时候,它会根据当前拷贝的数据类型是可变类型,还是不可变类型,有不同的处理方式。

In [88]: a = [11,22,33]

In [89]: b = copy.copy(a)

In [90]: id(a)
Out[90]: 59275144

In [91]: id(b)
Out[91]: 59525600

In [92]: a.append(44)

In [93]: a
Out[93]: [11, 22, 33, 44]

In [94]: b
Out[94]: [11, 22, 33]

In [95]:

In [95]:

In [95]: a = (11,22,33)

In [96]: b = copy.copy(a)

In [97]: id(a)
Out[97]: 58890680

In [98]: id(b)
Out[98]: 58890680
View Code

 

对于可变类型(列表)第一层相当于深拷贝独立开辟内存

对于不可变类型(元祖),就是浅拷贝,直接复制的是引用地址 

 

4. 拷贝的其他方式

 

  • 分片表达式可以赋值一个序列

 

a = "abc"

b = a[:]
  • 字典的copy方法可以拷贝一个字典

 

d = dict(name="zhangsan", age=27)

co = d.copy()
  • 有些内置函数可以生成拷贝(list)

 

    a = list(range(10))

    b = list(a)
  • copy模块中的copy函数

 

    import copy

    a = (1,2,3)

    b = copy.copy(a)

 

posted @ 2017-12-08 15:36  Crazymagic  阅读(199)  评论(0编辑  收藏  举报