Python开发 —— 变量、全局变量&函数的参数传递

1. Python变量

1.1 变量的定义和使用

在Python中,变量不需要显式声明。通过赋值语句,变量会自动创建。例如:

python 复制代码
x = 10
y = "Hello, World!"

在这段代码中,`x` 被赋值为整数10,而 `y` 被赋值为字符串 "Hello, World!"。

1.2 变量的类型

Python 是一种动态类型语言,这意味着变量的类型是在赋值时确定的,并且同一变量可以在程序的不同部分保存不同类型的值。例如:

python 复制代码
x = 10
print(type(x))  # 输出 <class 'int'>
x = "Hello"
print(type(x))  # 输出 <class 'str'>

1.3 变量的作用域

变量的作用域决定了变量在程序中的可访问范围。Python 主要有以下两种作用域:

局部变量:在函数内部定义,只在函数内部有效。

全局变量:在函数外部定义,可以在整个程序中访问。例如:

python 复制代码
global_var = "I am a global variable"

def my_function():
    local_var = "I am a local variable"
    print(global_var)  # 可以访问全局变量
    print(local_var)   # 可以访问局部变量

my_function()
print(local_var)  # 会报错,因为 local_var 只在函数内部有效

2. Python的参数传递

2.1 不可变对象(不可变数据类型)

不可变对象包括整数、浮点数、字符串和元组。这些对象在函数中被修改时,会生成新的对象,原对象保持不变。例如:

python 复制代码
def add_one(num):
    num += 1
    return num

a = 5
print(add_one(a))  # 输出 6
print(a)           # 输出 5,a 的值没有被修改

在这个例子中,`num += 1` 创建了一个新的整数对象,而 `a` 的值没有改变。

2.2 可变对象(可变数据类型 )

可变对象包括列表、字典和集合。这些对象在函数中被修改时,会影响到函数外的对象。例如:

python 复制代码
def append_one(lst):
    lst.append(1)

my_list = [0]
append_one(my_list)
print(my_list)  # 输出 [0, 1]

在这个例子中,lst.append(1) 修改了 `my_list` 的内容,因为 `lst` 和 `my_list` 引用的是同一个对象。

3. 开发出现的问题

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    result = logic_data_record(folder_num)
    print(result)

在代码中,`folder_num` 被作为参数传递给 `logic_data_record` 函数,并在函数内部的执行过程中递增。然而,每次调用该函数时,都从外部的 `while` 循环传递相同的初始值 `0` 给该函数,这导致每次调用函数时 `folder_num` 都被重新初始化为 `0`。

4. 解决方法1------使用 global

为了在函数中修改全局变量,需要使用 `global` 关键字声明该变量是全局的。这使得函数内部对该变量的修改会影响到全局作用域中的变量。

4.1 代码示例

python 复制代码
folder_num = 0  # 定义全局变量

def logic_data_record():
    global folder_num  # 声明使用全局变量
    folder_num += 1  # 修改全局变量
    return folder_num

while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

4.2 详细解释

4.2.1 定义全局变量

python 复制代码
folder_num = 0

folder_num 是一个全局变量,初始值为0。

4.2.2 声明使用全局变量

python 复制代码
def logic_data_record():
    global folder_num  # 声明 folder_num 为全局变量
    folder_num += 1  # 修改全局变量
    
    return folder_num

在 logic_data_record 函数中,使用 global folder_num 声明 folder_num 是全局变量。这样,函数内对 folder_num 的修改会影响到全局范围内的 folder_num。

4.2.3 循环调用函数

python 复制代码
while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

在 `while` 循环中,每次调用 `logic_data_record` 函数,`folder_num` 都会递增,并将递增后的值打印出来。

通过这种方式,每次循环时 `folder_num` 的值都会递增,并且变化会在全局范围内生效。

5. 解决方法2

为了让 `folder_num` 能够持续递增,需要将递增后的 `folder_num` 值返回给 `while` 循环,并使用这个返回值更新外部的 `folder_num` 变量。这样,每次循环时传递给函数的 `folder_num` 值都会是最新的递增值。

可以修改 `logic_data_record` 函数,使其在最后返回更新后的 `folder_num` 值。然后在 `while` 循环中使用这个返回值来更新外部的 `folder_num` 变量。以下是代码示例:

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    folder_num = logic_data_record(folder_num)
    print(folder_num)

通过这种方式,每次函数调用后都会递增 `folder_num`,并将新值传回主循环,使得下一次函数调用时使用的是递增后的值。这样就可以确保 `folder_num` 在每次迭代中都是增加的。

相关推荐
明月看潮生14 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
南宫理的日知录25 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup34 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
逊嘘42 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up44 分钟前
C语言心型代码解析
c语言·开发语言
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust