python - 为什么我的一个变量不需要声明而另一个变量需要声明?

标签 python function variables python-3.x scope

这段代码运行没有错误。但是在函数 find_available_filenumber 中,变量 render_folder 没有声明。所以我的问题是为什么这不会产生错误?

如果我删除 full_filename 作为参数,我会得到错误:

UnboundLocalError: local variable 'full_filename' referenced before assignment.

我不明白为什么在下面的代码示例中 render_folder 也不会发生这种情况:

import bpy
import os

#Functions
def find_available_filenumber(full_filename):
    file_number = 1

    while os.path.exists(render_folder + "\\" + full_filename):
        file_number += 1
        full_filename = create_full_filename(filename, file_number)

    return file_number

def create_full_filename(filename, file_number):
    file_extension = ".avi"
    full_filename = filename + "_" + str(file_number) + file_extension    

    return full_filename

#Paths and names
project_folder = "F:\\06_MotionPath_Dev\\"
os.chdir(project_folder)

render_folder = "Render\\QuickRenderAddon"
filename = bpy.context.scene.name  #Returns "QuickRenderAddon"
full_filename = create_full_filename(filename, 1)
filepath = render_folder + "\\" + full_filename

available_number = find_available_filenumber(full_filename)
print("Avail nmb: " + str(available_number))

最佳答案

啊是的经典“赋值前引用”

我写了一些示例代码来展示发生了什么。

test = "toast!"
toast = "test!"

def func():
    print test
    print toast

func()

上面的输出是

toast!
test!

这表明我们可以读取全局变量,但是写入它们呢?我不希望“ toast ”成为“测试!”不再是,而是“面包+ toastr !”。让我们把这个写出来。

test = "toast!"
toast = "test!"

def func():
    print test
    toast = "bread+toaster!"
    print toast

func()
print toast

这输出

toast!
bread+toaster!
test!

您会注意到我们能够打印局部分配的变量,但全局变量并没有改变。现在,让我们看另一个例子。

test = "toast!"
toast = "test!"

def func():
    print test
    print toast
    toast = "bread+toaster!"
    print toast

func()
print toast

这会抛出错误

UnboundLocalError: local variable 'toast' referenced before assignment

为什么?因为您稍后将变量“toast”声明为局部变量。 Python 注意到这一点并停止代码以防止错误。您稍后设置“toast”并不是更改全局变量,而是在名为“toast”的函数中声明一个局部变量。

如何解决这个问题?

第一个是在你的函数中添加一个全局子句

test = "toast!"
toast = "test!"

def func():
    global toast
    print test
    print toast
    toast = "bread+toaster!"
    print toast

func()
print toast

这输出

toast!
test!
bread+toaster!
bread+toaster!

您也可以将代码修改为类结构。

class bread():
    def __init__(self):
        self.test = "toast!"
        self.toast = "test!"

    def func(self):
        print self.test
        print self.toast
        self.toast = "bread+toaster!"
        print self.toast

b = bread()
b.func()

在我看来,类是最好的解决方案,因为它会增加模块化并帮助您减少意大利面条代码。

关于python - 为什么我的一个变量不需要声明而另一个变量需要声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27093089/

相关文章:

python - 图可视化在 TensorFlow2.1.0 中失败

我认为 JavaScript 没有返回值、范围和变量困惑?

C - stdin 到变量

python - 当输入应被接受为 float 时获取 "ValueError: Could not convert string to float: ' .' "

python - 在散点图中绘制 PCA 输出,同时根据标签着色 python matplotlib

python - xarray 可以实现面积积分和面积加权平均值吗?

r - 如何对 "stepfun"类的两个阶跃函数(R-stepfun)求和?

c - 用户定义函数返回 0,即使不应该返回 0

javascript - 奇怪的 JS 行为 : Additional line is needed to execute function?

c# - 如何使用 javascript 将 C# 变量分配给 asp 元素