鱼C论坛

 找回密码
 立即注册
查看: 1741|回复: 16

[已解决]不是说元组不能被修改吗?

[复制链接]
发表于 2022-6-24 21:52:11 | 显示全部楼层 |阅读模式

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

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

x
import pygame
import sys
from pygame.locals import *


pygame.init()


size = width, height = 640, 480
bg = (0, 0, 0)


clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')


turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2



print(turtle.get_at(position.center))
print(type(turtle.get_at(position.center)))


while True:
   
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()


    #screen.fill(bg)
    screen.blit(background, (0, 0))
    screen.blit(turtle, position)
   

    pygame.display.flip()

    clock.tick(30)

运行后返回:

(94, 93, 36, 255)
<class 'pygame.Color'>

可见这是一个类,而小甲鱼在教学视频里说这是一个4元组,后面还用for循环语句+set_at()方法对其进行了修改

------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------

【我的问题】

1、不是说元组不可修改的吗?


******************************

感谢大神不吝赐教,为新手解疑释惑。

赠人玫瑰,手有余香,好人一生平安!

最佳答案
2022-6-24 22:58:46
lzb1001 发表于 2022-6-24 22:50
谢谢大神指点,不过这只是说明了为什么小甲鱼称它为4元组的原因。

******************************* ...

虽然他被称为元组,可它本质上并不是元组
pygame.Color甚至都不是turpe的子类
你用is运算符就知道pygame.Color本质上不是元组
>>> a = pygame.Color(12,12,12,12)
>>> b = (12,12,12,12)
>>> a is b
False
而你用==运算符却返回是True,这也是他被称为4元组的其中一个原因
>>> a == b
True
所以,pygame.Color本质上不是元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-24 21:57:55 | 显示全部楼层
        元组一定不可修改,你到底想问什么,小甲鱼在视频里的一句话?莫名其妙!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 22:03:38 | 显示全部楼层
jackz007 发表于 2022-6-24 21:57
元组一定不可修改,你到底想问什么,小甲鱼在视频里的一句话?莫名其妙!

1、小甲鱼视频里说这是一个四元组(实际类型显示是一个类),

2、既然大家都知道元组是不可修改,但小甲鱼后面又举了一个例子用修改元组的方式来设置透明?小甲鱼举例见下:

import pygame
import sys
from pygame.locals import *


pygame.init()


size = width, height = 640, 480
bg = (0, 0, 0)


clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')


turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2




for i in range(position.width):

    for j in range(position.height):

        temp = turtle.get_at((i, j))
        print(type(temp)) # 返回的类型是<class 'pygame.Color'>,不是元组???
        
        if temp[3] != 0:

            temp[3] = 200

        turtle.set_at((i, j), temp)


while True:
   
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()


    #screen.fill(bg)
    screen.blit(background, (0, 0))
    screen.blit(turtle, position)
   

    pygame.display.flip()

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

使用道具 举报

发表于 2022-6-24 22:13:46 | 显示全部楼层
lzb1001 发表于 2022-6-24 22:03
1、小甲鱼视频里说这是一个四元组(实际类型显示是一个类),

2、既然大家都知道元组是不可修改,但小 ...

是不是理解错误???
get_at((i, j))
参数 "(i, j)" 是个元组,是你传入的元组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 22:21:22 | 显示全部楼层
本帖最后由 lzb1001 于 2022-6-24 22:40 编辑
ba21 发表于 2022-6-24 22:13
是不是理解错误???
get_at((i, j))
参数 "(i, j)" 是个元组,是你传入的元组。


……
temp = turtle.get_at((i, j))  # get_at()方法获得的是单个像素的颜色(即RGBA值),然后将RGBA值赋值给变量temp,而RGBA值=(R, G, B, A),这是不是就是小甲鱼说的四元组?temp[3]不是指的是其中A的值吗?

        print(type(temp)) # 将返回<class 'pygame.Color'>,不是元组???
        
        if temp[3] != 0:

            temp[3] = 200
……

试着打印temp的值:

import pygame
import sys
from pygame.locals import *


pygame.init()


size = width, height = 640, 480
bg = (0, 0, 0)


clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')


turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2




for i in range(position.width):

    for j in range(position.height):

        temp = turtle.get_at((i, j))
        print(type(temp)) # 返回的类型是<class 'pygame.Color'>,不是元组???
        
        if temp[3] != 0:
            print(temp) # 打印修改前的RGBA值

            temp[3] = 200
            print(temp) # 打印修改后的RGBA值

        turtle.set_at((i, j), temp)


while True:
   
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()


    #screen.fill(bg)
    screen.blit(background, (0, 0))
    screen.blit(turtle, position)
   

    pygame.display.flip()

    clock.tick(30)

返回结果(截选部分)如下:

123.png

从图中也可以看出temp就是RGBA的值。

******************

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

使用道具 举报

发表于 2022-6-24 22:39:58 | 显示全部楼层
本帖最后由 临时号 于 2022-6-24 22:44 编辑
lzb1001 发表于 2022-6-24 22:21
……
temp = turtle.get_at((i, j))  # get_at()方法获得的是单个像素的颜色(即RGBA值),然后将RGBA ...


在pygame的官方文档中有这样一句话
Color objects support equality comparison with other color objects and 3 or 4 element tuples of integers

翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
这也正是小甲鱼称它为4元组的原因,最多4个元素的元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 22:50:14 | 显示全部楼层
本帖最后由 lzb1001 于 2022-6-24 22:52 编辑
临时号 发表于 2022-6-24 22:39
在pygame的官方文档中有这样一句话

翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的 ...


谢谢大神指点,不过这只是说明了为什么小甲鱼称它为4元组的原因。

*******************************************

Color objects support equality comparison with other color objects and 3 or 4 element tuples of integers

翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的相等比较

1、没看懂这句话的意思。我英文自认还算不错,但看编程语言的官网原文档有时还是很晕,即使用翻译软件有时也不一定能理解中文的翻译,因为翻译软件是直翻,翻译的不一定看得懂

2、既然RGB是3元组,RGBA是4元组,元组不可修改,那为何可以通过temp[3]=200的方式来修改A的值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 22:58:46 | 显示全部楼层    本楼为最佳答案   
lzb1001 发表于 2022-6-24 22:50
谢谢大神指点,不过这只是说明了为什么小甲鱼称它为4元组的原因。

******************************* ...

虽然他被称为元组,可它本质上并不是元组
pygame.Color甚至都不是turpe的子类
你用is运算符就知道pygame.Color本质上不是元组
>>> a = pygame.Color(12,12,12,12)
>>> b = (12,12,12,12)
>>> a is b
False
而你用==运算符却返回是True,这也是他被称为4元组的其中一个原因
>>> a == b
True
所以,pygame.Color本质上不是元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 23:02:01 | 显示全部楼层
我们再来念一下这句话
Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
意思很简单元组可以用==运算符和它进行比较,也就是我上一个例子说的
>>> a == b
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 23:02:32 | 显示全部楼层
本帖最后由 lzb1001 于 2022-6-24 23:04 编辑
临时号 发表于 2022-6-24 22:58
虽然他被称为元组,可它本质上并不是元组
pygame.Color甚至都不是turpe的子类
你用is运算符就知道pygame ...


确实,用代码print(type(temp)) 返回的类型是<class 'pygame.Color'>,而不是tuple元组

但它返回的结果(12,12,12,12)让人看得觉得很像元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 23:03:48 | 显示全部楼层
lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组


对啊,temp是pygame.Color类实例化出来的一个对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 23:04:21 From FishC Mobile | 显示全部楼层
本帖最后由 hrpzcf 于 2022-6-24 23:05 编辑

只要type结果不是<class 'tuple'>,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因为这些都可以通过重写魔法方法来实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 23:07:16 | 显示全部楼层
lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组

但它返回的结果(12,12,12,12)让人看 ...

所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 23:07:49 | 显示全部楼层
本帖最后由 lzb1001 于 2022-6-24 23:42 编辑
hrpzcf 发表于 2022-6-24 23:04
只要type结果不是,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因 ...


大神看得真准,我就是犯了这样的错误:一方面听了小甲鱼说4元组,另一方面看它返回的是个“元组”形式,再加上下标,三个加一起所以我就认为它是元组,谢谢大神的提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-24 23:10:11 | 显示全部楼层
有一说一,虽然没看你说的小甲鱼那个视频,但有没有可能是你自己钻牛角尖了。一个问题,Python里有元组这个类型,但你何时听说过Python里的元组数据是几元组的叫法,至少我没听说过,而且搜索引擎简单查询了一下,也没有相关描述。换个角度,数学里这个叫法却是并不少见,包含三个元素的一组数据叫作三元组,平面坐标(x,y)又叫作二元组。所以三元组这个叫法是描述这组数据的元素个数,与Python的元组类型无关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 23:34:18 | 显示全部楼层
临时号 发表于 2022-6-24 23:07
所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组

这个名字很容易误会,尤其对于初学者
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-24 23:35:42 | 显示全部楼层
风车呼呼呼 发表于 2022-6-24 23:10
有一说一,虽然没看你说的小甲鱼那个视频,但有没有可能是你自己钻牛角尖了。一个问题,Python里有元组这个 ...

谢谢,我是学得、看得、听得比较仔细,加上看到弹幕中也有其他初学者有此疑问,所以提出来,倒不是什么纠结的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 19:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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