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

时间:2014-11-23 19:09:10

标签: 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))

3 个答案:

答案 0 :(得分:3)

啊是经典"在作业之前参考"

我写了一些示例代码来显示正在发生的事情。

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

def func():
    print test
    print toast

func()

以上的输出是

toast!
test!

这表明我们可以读取全局变量,但是写入它们呢?我不想要'吐司'要测试!'不再,而是面包+烤面包机!'。让我们写出来。

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

为什么呢?因为您之后宣布了您的变量“吐司”'作为局部变量。 Python注意到这一点并停止代码以防止错误。你设置了'吐司'后来不是改变全局变量,而是在名为' 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()

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

答案 1 :(得分:1)

编辑:忽略我,我正在移动,所以我没有正确阅读。

错误表示“在分配前引用”。换句话说,在为其写入值之前,您正尝试从该变量中读取值。

我觉得这个错误是在你的while条件中造成的,因为你在while循环体内写入它之前检查了它。

答案 2 :(得分:1)

  

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

这是因为render_folder在调用find_available_filenumber时被声明,即使在定义函数时未声明它。