鱼C论坛

 找回密码
 立即注册
查看: 1468|回复: 13

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

[复制链接]
发表于 2022-2-27 09:20:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Screenshot_20220225_142211.jpg Screenshot_20220227_081930.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 09:40:06 | 显示全部楼层
这是在哪做题的呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 09:45:32 | 显示全部楼层
14题
list1 = [1]
list2 = [2]
dict1 = {"1": 1}
set1 = {1, }

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

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

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

15 不用说了吧,局部变量再函数退出后就被回收了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 09:53:42 | 显示全部楼层
被释放就是变量的内存空间被系统回收,是py的保护机制

简单数据类型,如果你不声明全局global标志,你在函数中改变的话,外边是不会改变的
def mq():
    list1 = [2]
    a = 2
    print(id(list1))
    print(id(a))
    print(list1, list2, dict1, set1, a)


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

输出
[2] [2] {'1': 1} {1} 2
1
[1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 10:59:16 | 显示全部楼层
大马强 发表于 2022-2-27 09:53
被释放就是变量的内存空间被系统回收,是py的保护机制

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

我在想16题,协程函数怎么算的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-27 11:22:56 | 显示全部楼层
isdkz 发表于 2022-2-27 09:40
这是在哪做题的呀?

学校给的测试题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-27 11:30:16 | 显示全部楼层
大马强 发表于 2022-2-27 09:53
被释放就是变量的内存空间被系统回收,是py的保护机制

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

我只是在函数内部使用全局变量,但不修该它,为什么还要申明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


我觉得,调用这个词,和赋值是不一样的


微信截图_20220227115620.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 11:59:34 | 显示全部楼层
Stubborn 发表于 2022-2-27 11:56
我觉得,调用这个词,和赋值是不一样的

但是调用的话,在函数里面有赋值呀,我在函数里面查看的是局部变量的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
>>>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

16题,函数退出后,被释放,意思是退出函数后,不能在访问函数内部的变量
不是很清楚协程函数算不算函数,如果算,这个16题错误答案也是有值得争议的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

首先,函数退出后,它里面的变量并不会释放,第二,协程函数得抛出 StopIteration 之后才算退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-27 20:36:34 | 显示全部楼层
isdkz 发表于 2022-2-27 16:11
首先,函数退出后,它里面的变量并不会释放,第二,协程函数得抛出 StopIteration 之后才算退出

朋友,那这这俩个题都有问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表