风百默 发表于 2022-2-27 09:20:40

被释放是什么意思?简单数据类型全局变量在函数内部用时为什么要声明?

isdkz 发表于 2022-2-27 09:40:06

这是在哪做题的呀?

大马强 发表于 2022-2-27 09:45:32

14题
list1 =
list2 =
dict1 = {"1": 1}
set1 = {1, }

def mq():
    list1 =
    print(list1, list2, dict1, set1)
   
mq()


输出
{'1': 1} {1}
1、列表是可以全局引用的
2、函数内有和外边一样的变量,优先用函数内定义的
3、组合数据就是字典,序列,集合,这些都是可以全局引用,如果外面定义了,不会再去定义一个新对象

15 不用说了吧,局部变量再函数退出后就被回收了

大马强 发表于 2022-2-27 09:53:42

被释放就是变量的内存空间被系统回收,是py的保护机制

简单数据类型,如果你不声明全局global标志,你在函数中改变的话,外边是不会改变的

def mq():
    list1 =
    a = 2
    print(id(list1))
    print(id(a))
    print(list1, list2, dict1, set1, a)


list1 =
list2 =
dict1 = {"1": 1}
set1 = {1, }
a = 1
mq()
print(a)

输出
{'1': 1} {1} 2
1

Stubborn 发表于 2022-2-27 10:59:16

大马强 发表于 2022-2-27 09:53
被释放就是变量的内存空间被系统回收,是py的保护机制

简单数据类型,如果你不声明全局global标志,你在 ...

我在想16题,协程函数怎么算的

风百默 发表于 2022-2-27 11:22:56

isdkz 发表于 2022-2-27 09:40
这是在哪做题的呀?

学校给的测试题

风百默 发表于 2022-2-27 11:30:16

大马强 发表于 2022-2-27 09:53
被释放就是变量的内存空间被系统回收,是py的保护机制

简单数据类型,如果你不声明全局global标志,你在 ...

我只是在函数内部使用全局变量,但不修该它,为什么还要申明

isdkz 发表于 2022-2-27 11:47:05

Stubborn 发表于 2022-2-27 10:59
我在想16题,协程函数怎么算的

先不说协程函数,哪怕是普通的函数,他也不会把函数内定义的变量释放,你可以在 python shell 测试一下:>>> a = 890    # 定义 a
>>> id(a)   # 查看 a 的地址
1778661362096
>>> a = 890   # 重新定义 a
>>> id(a)       # 再查看 a 的地址,可以看到 a 如果重新定义,它的地址不会跟上次一样
1778663899856
>>> def test():   
...         a = 890    # 在函数内部定义 a
...         print(id(a))# 打印 a 的地址
...
>>> test()   # 多次调用 test,可以看到 a 的地址都没变,说明 a 并没有被释放
1778663899376
>>> test()
1778663899376
>>> test()
1778663899376
>>> test()
1778663899376
>>>

Stubborn 发表于 2022-2-27 11:56:54

isdkz 发表于 2022-2-27 11:47
先不说协程函数,哪怕是普通的函数,他也不会把函数内定义的变量释放,你可以在 python shell 测试一下 ...

我觉得,调用这个词,和赋值是不一样的{:10_277:}


isdkz 发表于 2022-2-27 11:59:34

Stubborn 发表于 2022-2-27 11:56
我觉得,调用这个词,和赋值是不一样的

但是调用的话,在函数里面有赋值呀,我在函数里面查看的是局部变量的地址

isdkz 发表于 2022-2-27 12:05:28

本帖最后由 isdkz 于 2022-2-27 12:06 编辑

Stubborn 发表于 2022-2-27 11:56
我觉得,调用这个词,和赋值是不一样的

还有一点就是,整数的话你不要用 -5 到 256 的,python 机制里面会有一个缓存池,

有一部分对象是在运行python 解释器的时候就产生的了,它们的地址是固定的,就是为了避免需要频繁使用的对象的内存地址浪费,

所以你把多少个变量指向 -5 到 256 之间的整数都是同一个地址的
>>> a = -5
>>> b = -5
>>> c = -5
>>> d = -5
>>> e = -5
>>> a is b is c is d is e
True
>>>

Stubborn 发表于 2022-2-27 14:15:15

风百默 发表于 2022-2-27 11:30
我只是在函数内部使用全局变量,但不修该它,为什么还要申明

我觉得题有问题
14,你的回答是不对的,引用一个容器类型数字,不会重新创建的。
该答案的正确答案,我觉得有问题,如你所说,使用全局变量,不涉及修改是不用显式声明的。

16题,函数退出后,被释放,意思是退出函数后,不能在访问函数内部的变量
不是很清楚协程函数算不算函数,如果算,这个16题错误答案也是有值得争议的

isdkz 发表于 2022-2-27 16:11:11

Stubborn 发表于 2022-2-27 14:15
我觉得题有问题
14,你的回答是不对的,引用一个容器类型数字,不会重新创建的。
该答案的正确答案,我 ...

首先,函数退出后,它里面的变量并不会释放,第二,协程函数得抛出 StopIteration 之后才算退出

风百默 发表于 2022-2-27 20:36:34

isdkz 发表于 2022-2-27 16:11
首先,函数退出后,它里面的变量并不会释放,第二,协程函数得抛出 StopIteration 之后才算退出

朋友,那这这俩个题都有问题吗?
页: [1]
查看完整版本: 被释放是什么意思?简单数据类型全局变量在函数内部用时为什么要声明?