lzb1001 发表于 2022-6-24 21:52:11

不是说元组不能被修改吗?

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、不是说元组不可修改的吗?


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

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

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

jackz007 发表于 2022-6-24 21:57:55

      元组一定不可修改,你到底想问什么,小甲鱼在视频里的一句话?莫名其妙!

lzb1001 发表于 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 != 0:

            temp = 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)

ba21 发表于 2022-6-24 22:13:46

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

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

是不是理解错误???
get_at((i, j))
参数 "(i, j)" 是个元组,是你传入的元组。

lzb1001 发表于 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不是指的是其中A的值吗?

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

            temp = 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 != 0:
          print(temp) # 打印修改前的RGBA值

            temp = 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)

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



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

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

请大神多多指教。

临时号 发表于 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个元素的元组

lzb1001 发表于 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=200的方式来修改A的值呢?

临时号 发表于 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本质上不是元组

临时号 发表于 2022-6-24 23:02:01

我们再来念一下这句话
Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
意思很简单元组可以用==运算符和它进行比较,也就是我上一个例子说的
>>> a == b
True

lzb1001 发表于 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)让人看得觉得很像元组

临时号 发表于 2022-6-24 23:03:48

lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组

对啊,temp是pygame.Color类实例化出来的一个对象

hrpzcf 发表于 2022-6-24 23:04:21

本帖最后由 hrpzcf 于 2022-6-24 23:05 编辑

只要type结果不是<class 'tuple'>,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因为这些都可以通过重写魔法方法来实现。

临时号 发表于 2022-6-24 23:07:16

lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组

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

所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组

lzb1001 发表于 2022-6-24 23:07:49

本帖最后由 lzb1001 于 2022-6-24 23:42 编辑

hrpzcf 发表于 2022-6-24 23:04
只要type结果不是,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因 ...

大神看得真准,我就是犯了这样的错误:一方面听了小甲鱼说4元组,另一方面看它返回的是个“元组”形式,再加上下标,三个加一起所以我就认为它是元组,谢谢大神的提醒

风车呼呼呼 发表于 2022-6-24 23:10:11

有一说一,虽然没看你说的小甲鱼那个视频,但有没有可能是你自己钻牛角尖了。一个问题,Python里有元组这个类型,但你何时听说过Python里的元组数据是几元组的叫法,至少我没听说过,而且搜索引擎简单查询了一下,也没有相关描述。换个角度,数学里这个叫法却是并不少见,包含三个元素的一组数据叫作三元组,平面坐标(x,y)又叫作二元组。所以三元组这个叫法是描述这组数据的元素个数,与Python的元组类型无关

lzb1001 发表于 2022-6-24 23:34:18

临时号 发表于 2022-6-24 23:07
所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组

这个名字很容易误会,尤其对于初学者

lzb1001 发表于 2022-6-24 23:35:42

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

谢谢,我是学得、看得、听得比较仔细,加上看到弹幕中也有其他初学者有此疑问,所以提出来,倒不是什么纠结的问题。
页: [1]
查看完整版本: 不是说元组不能被修改吗?